StupidBeauty
Read times:1321Posted at:Sat Jun 7 05:00:56 2014
- no title specified

快速 一览

NSView 类定义了每个程序中的基本的绘图、事件处理及打印架构。妳一般不会直接使用 NSView 对象。 在实际的开发当中, 妳会使用 NSView 的某些子类的对象,或者亲自编写 NSView 的子类并且覆盖某些方法 ,以实现妳预期的行为。对于任何 一个视图对象来说,有狠多方法是可以直接按原样使用的。

主要特性

  • •.事件处理

  • •.将显示内容与屏幕和打印机整合

  • •.灵活的坐标系统

  • •.图标的拖放

概述

NSView 类提供了一个架构,可用于在妳的程序中绘图 、打印及处理事件。 NSView 类(或者某个 子类 )的实例通常被称作视图对象,或者简单地称作视图。

视图 会处理好妳的程序中可见的内容的呈现及交互过程。 妳将一个或多个视图放置到某个 NSWindow 对象中,后者就是对妳的所有内容的一个封装。 一个视图对象会定义一个矩形区域,并在这个区域中绘图、接收鼠标事件。视图 还会处理好其它琐事,包括:图标的拖放;与 NSScrollView 配套,实现高效的 滚动。

NSView 类的大部分功能都是由 程序 (Application Kit)自动调用的。 除非妳在妳的 NSView 子类中实现了大量具体功能,或者 在运行时深入地处理视图层次结构中的内容,否则,妳不需要太了解这个类的接口。参考 “常用方法” ,以了解那些妳无需关心其细节便可以使用的方法。

欲知更多关于 NSView 实例如何处理事件和动作消息的信息,则参考 Cocoa事件处理指南 。欲知更多关于如何显示提示文字 和上下文菜单的信息,则参考 NSMenu类参考 中的 “显示上下文菜单” NSWindow类参考 中的 “管理提示文字”

子类化的注意事项

当我们牵涉到子类化和继承的时候, NSView 可能 应用开发包 中最重要的类了。 妳在Cocoa 程序中看到的大部分用户界面对象都是继承自 NSView 的。 如果妳想创建一个以特殊方式绘制自身的对象,或是一个以特殊方式对鼠标点击事件作出响应的对象,那么,妳需要创建一个 NSView 子类(或者某个 NSView 子类的子类)。 NSView 进行子类化,是一种常见且重要的过程,因此,狠多技术文档都同时说明了如何在子类中进行绘制操作以及如何在子类中对事件作出响应。参考 Cocoa绘图指南 Cocoa事件处理指南 (尤其 Cocoa事件处理指南 中的 “处理鼠标事件” “鼠标事件” )。

在妳的子类中处理事件

如果 妳直接子类化 NSView ,并且处理特定类型的事件的话,则,在妳的那些与事件相关的方法中就不应当调用 super 。视图 是从它们的 NSResponder 亲代类中继承得到事件处理能力的。响应 器(responders)的默认行为是将事件沿着响应器链向上传递,如果妳是在自定义的视图中处理事件的话,那么,这个默认行为应当不是妳想要的行为。因此 ,如果妳的视图实现了以下任意一个方法并且处理对应的事件的话,则,妳不应当调用 super

注意 因为 NSView 改变 rightMouseDown: 方法的默认行为,因此,当妳在自定义的子类中实现那个方法时,应当调用 super

如果 妳的自定义视图是继承自别的类,而不是继承自 NSView ,那么,应当调用 super ,以让亲代视图处理任何未被妳处理的事件。

实例方法

dragImage:at:offset:event:pasteboard:source:slideBack:

初始化一个以此方法的接收者为起点的拖放操作,允许用户将一砣带有指定图标的任意数据拖放到任意一个具有可接受拖放数据的窗口或视图对象的程序中。

- (void)dragImage:( NSImage *) anImage at:( NSPoint ) imageLoc offset:( NSSize ) mouseOffset event:( NSEvent *) theEvent pasteboard:( NSPasteboard *) pboard source:(id) sourceObject slideBack:(BOOL) slideBack

参数

anImage

要拖放的 NSImage 对象。

imageLoc

该图片的左下角在此方法的接收者的坐标系统中的位置。 它决定了被拖放的图片相对于鼠标光标的位置。在确定该图片的位置时,妳应当使用鼠标被按下时的坐标(可通过 theEvent 获取),而不是当前状态下的鼠标坐标。

mouseOffset

这个参数会被无视。

theEvent

触发了这个拖放操作(下文会详述)的那个鼠标左键按下事件。

pboard

保存着要被传递给目标对象的数据的那个剪贴板对象(下文会详述)。

sourceObject

这个对象充当着此次拖放操作的控制器。 它必须遵守 NSDraggingSource 协议 ,并且,通常就是此方法的接收者本身或者是它的 NSWindow 对象。

slideBack

一个逻辑值(Boolean),表示,当该拖放操作被拒绝时,被拖放的图片是否应当飞回来。如果 slideBack 被设置为 YES ,并且该图片未被拖放操作的目标对象接受的话,则图片会飞回到 imageLoc 。如果设置为 NO ,则该图片不会飞回。

讨论

这个方法只能在自己重写的 mouseDown: mouseDragged: 方法中调用。

在调用这个方法之前,妳必须把将要传递的数据放置到 pboard 中。 要想做到这一点的话,则,获取到拖放操作的剪贴板对象( NSDragPboard ),声明好数据的类型,然后将数据放置到剪贴板上。以下代码片断,会针对该图片本身初始化一个拖放操作(也就是说,图片本身就是要传递的数据):

- ( void )mouseDown:(NSEvent *)theEvent

{

NSSize dragOffset = NSMakeSize(0.0, 0.0);

NSPasteboard *pboard;

pboard = [NSPasteboard pasteboardWithName:NSDragPboard];

[pboard declareTypes:[NSArray arrayWithObject:NSTIFFPboardType] owner:self];

[pboard setData:[[self image] TIFFRepresentation] forType:NSTIFFPboardType];

[self dragImage:[self image] at:[self imageLocation] offset:dragOffset

event:theEvent pasteboard:pboard source:self slideBack:YES];

return;

}

参考 NSDraggingSource NSDraggingInfo NSDraggingDestination 协议规范,以了解更多关于拖放操作的信息。

参考

S

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands